পাইথনের মাধ্যমে ডিজিটাল অডিওর জগতকে আবিষ্কার করুন। এই বিস্তারিত গাইডটিতে শব্দ বিশ্লেষণ ও সংশ্লেষণ, লাইব্রোসা ও সাইপাই-এর মতো কী লাইব্রেরি এবং ডেভেলপার ও উৎসাহীদের জন্য ব্যবহারিক কোড উদাহরণ আলোচনা করা হয়েছে।
পাইথন অডিও প্রসেসিং: শব্দ বিশ্লেষণ ও সংশ্লেষণের গভীর পর্যালোচনা
শব্দ হলো মানুষের অভিজ্ঞতার একটি মৌলিক অংশ। আমরা যে সঙ্গীত ভালোবাসি, যে কণ্ঠস্বর চিনি, আমাদের পরিবেশের পারিপার্শ্বিক কোলাহল পর্যন্ত, অডিও ডেটা সমৃদ্ধ, জটিল এবং গভীরভাবে অর্থপূর্ণ। ডিজিটাল যুগে, বিনোদন, কৃত্রিম বুদ্ধিমত্তা এবং বৈজ্ঞানিক গবেষণার মতো বিভিন্ন ক্ষেত্রে এই ডেটা পরিচালনা এবং বোঝার ক্ষমতা একটি গুরুত্বপূর্ণ দক্ষতা হয়ে উঠেছে। ডেভেলপার এবং ডেটা সায়েন্টিস্টদের জন্য, পাইথন এই কাজের জন্য একটি শক্তিশালী মাধ্যম হিসেবে আবির্ভূত হয়েছে, যা ডিজিটাল সিগন্যাল প্রসেসিং (DSP)-এর জন্য লাইব্রেরির একটি শক্তিশালী ইকোসিস্টেম সরবরাহ করে।
অডিও প্রসেসিংয়ের কেন্দ্রে রয়েছে দুটি পরিপূরক শাখা: শব্দ বিশ্লেষণ (sound analysis) এবং শব্দ সংশ্লেষণ (sound synthesis)। এরা ডিজিটাল অডিওর পরিপূরক দুটি দিক:
- বিশ্লেষণ (Analysis) হলো বিচ্ছেদের প্রক্রিয়া। এটি একটি বিদ্যমান অডিও সিগন্যাল নিয়ে তাকে ভেঙে অর্থপূর্ণ তথ্য বের করার সাথে জড়িত। এটি এই প্রশ্নের উত্তর দেয়, "এই শব্দটি কী দিয়ে তৈরি?"
- সংশ্লেষণ (Synthesis) হলো নির্মাণের প্রক্রিয়া। এটি গাণিতিক মডেল এবং অ্যালগরিদম ব্যবহার করে স্ক্র্যাচ থেকে একটি অডিও সিগন্যাল তৈরি করার সাথে জড়িত। এটি এই প্রশ্নের উত্তর দেয়, "আমি কীভাবে এই শব্দটি তৈরি করতে পারি?"
এই বিস্তারিত গাইডটি আপনাকে উভয় জগতের মধ্য দিয়ে একটি যাত্রায় নিয়ে যাবে। আমরা তাত্ত্বিক ভিত্তিগুলো অন্বেষণ করব, প্রয়োজনীয় পাইথন টুলগুলির সাথে পরিচয় করিয়ে দেব এবং ব্যবহারিক কোডের উদাহরণ দেখাব যা আপনি নিজে চালাতে এবং মানিয়ে নিতে পারবেন। আপনি ডেটা সায়েন্টিস্ট হোন যিনি অডিও ফিচার বিশ্লেষণ করতে চান, সঙ্গীতশিল্পী হোন যিনি অ্যালগরিদমিক কম্পোজিশনে আগ্রহী, বা ডেভেলপার হোন যিনি পরবর্তী দুর্দান্ত অডিও অ্যাপ্লিকেশন তৈরি করছেন, এই নিবন্ধটি আপনাকে শুরু করার জন্য প্রয়োজনীয় ভিত্তি সরবরাহ করবে।
পর্ব ১: বিচ্ছেদের শিল্প: পাইথন দিয়ে শব্দ বিশ্লেষণ
শব্দ বিশ্লেষণ অনেকটা গোয়েন্দার মতো কাজ। আপনাকে একটি প্রমাণ দেওয়া হয়—একটি অডিও ফাইল—এবং আপনার কাজ হলো আপনার সরঞ্জাম ব্যবহার করে এর গোপনীয়তা উন্মোচন করা। কী নোট বাজানো হয়েছিল? কে কথা বলছিল? শব্দটি কোন ধরণের পরিবেশে রেকর্ড করা হয়েছিল? এই প্রশ্নগুলোর উত্তর শব্দ বিশ্লেষণ আমাদের দিতে সাহায্য করে।
ডিজিটাল অডিওর মূল ধারণা
শব্দ বিশ্লেষণ করার আগে, আমাদের বুঝতে হবে এটি কম্পিউটারে কীভাবে উপস্থাপিত হয়। একটি অ্যানালগ শব্দ তরঙ্গ একটি অবিচ্ছিন্ন সংকেত। এটিকে ডিজিটালভাবে সংরক্ষণ করতে, আমাদের স্যাম্পলিং নামক একটি প্রক্রিয়ার মাধ্যমে এটিকে রূপান্তর করতে হবে।
- স্যাম্পলিং রেট (Sampling Rate): এটি প্রতি সেকেন্ডে অডিও সিগন্যালের নেওয়া নমুনার (স্ন্যাপশট) সংখ্যা। এটি হার্টজ (Hz) এ পরিমাপ করা হয়। সঙ্গীতের জন্য একটি সাধারণ স্যাম্পলিং রেট হলো ৪৪,১০০ হার্টজ (৪৪.১ কিলোহার্টজ), যার মানে শব্দের প্রশস্ততার ৪৪,১০০ টি স্ন্যাপশট প্রতি সেকেন্ডে নেওয়া হয়।
- বিট ডেপথ (Bit Depth): এটি প্রতিটি নমুনার রেজোলিউশন নির্ধারণ করে। একটি উচ্চতর বিট ডেপথ বৃহত্তর ডাইনামিক রেঞ্জ (সবচেয়ে শান্ত এবং সবচেয়ে জোরালো শব্দের মধ্যে পার্থক্য) প্রদান করে। সিডির জন্য ১৬-বিট ডেপথ স্ট্যান্ডার্ড।
এই প্রক্রিয়ার ফল হলো সংখ্যার একটি ক্রম, যা আমরা একটি ওয়েভফর্ম (waveform) হিসাবে উপস্থাপন করতে পারি।
ওয়েভফর্ম: প্রশস্ততা এবং সময়
অডিওর সবচেয়ে মৌলিক উপস্থাপনা হলো ওয়েভফর্ম। এটি সময় বনাম প্রশস্ততার (loudness) একটি দ্বি-মাত্রিক প্লট। একটি ওয়েভফর্ম দেখলে আপনি অডিওর গতিশীলতা সম্পর্কে একটি সাধারণ ধারণা পেতে পারেন, তবে এটি এর টোনাল বিষয়বস্তু সম্পর্কে খুব বেশি কিছু বলে না।
স্পেকট্রাম: ফ্রিকোয়েন্সি এবং পিচ
একটি শব্দের টোনাল গুণাবলী বোঝার জন্য, আমাদের টাইম ডোমেইন (ওয়েভফর্ম) থেকে ফ্রিকোয়েন্সি ডোমেইনে যেতে হবে। এটি ফাস্ট ফুরিয়ার ট্রান্সফর্ম (FFT) নামক একটি অ্যালগরিদম ব্যবহার করে করা হয়। FFT একটি ওয়েভফর্মের একটি অংশকে তার গঠনকারী সাইন ওয়েভগুলিতে বিভক্ত করে, যার প্রত্যেকটির একটি নির্দিষ্ট ফ্রিকোয়েন্সি এবং প্রশস্ততা রয়েছে। এর ফল হলো একটি স্পেকট্রাম (spectrum), যা ফ্রিকোয়েন্সি বনাম প্রশস্ততার একটি প্লট। এই প্লটটি প্রকাশ করে যে শব্দটিতে কোন ফ্রিকোয়েন্সি (বা পিচ) উপস্থিত রয়েছে এবং সেগুলি কতটা শক্তিশালী।
টিম্বার (Timbre): শব্দের "রঙ"
একই নোট (একই মৌলিক ফ্রিকোয়েন্সি) বাজানোর সময় একটি পিয়ানো এবং একটি গিটারের শব্দ কেন এত আলাদা শোনায়? উত্তরটি হলো টিম্বার (উচ্চারণ "ট্যাম-বার")। টিম্বার নির্ধারিত হয় হারমোনিক্স (harmonics) বা ওভারটোন (overtones)-এর উপস্থিতি এবং তীব্রতা দ্বারা—এগুলি হলো মৌলিক ফ্রিকোয়েন্সির পূর্ণসংখ্যার গুণিতক অতিরিক্ত ফ্রিকোয়েন্সি। এই হারমোনিক্সের অনন্য সংমিশ্রণই একটি বাদ্যযন্ত্রকে তার বৈশিষ্ট্যপূর্ণ শব্দের রঙ দেয়।
অডিও বিশ্লেষণের জন্য প্রয়োজনীয় পাইথন লাইব্রেরি
পাইথনের শক্তি তার তৃতীয় পক্ষের লাইব্রেরির বিশাল সংগ্রহের মধ্যে নিহিত। অডিও বিশ্লেষণের জন্য, কয়েকটি লাইব্রেরি বিশেষভাবে উল্লেখযোগ্য।
- Librosa: এটি পাইথনে অডিও এবং সঙ্গীত বিশ্লেষণের জন্য প্রধান লাইব্রেরি। এটি অডিও লোড করা, এটিকে ভিজ্যুয়ালাইজ করা এবং টেম্পো, পিচ এবং ক্রোমাটিক উপস্থাপনার মতো উচ্চ-স্তরের ফিচারগুলি বের করার জন্য একটি বিশাল টুলকিট সরবরাহ করে।
- SciPy: সায়েন্টিফিক পাইথন স্ট্যাকের একটি মূল লাইব্রেরি, SciPy-তে একটি শক্তিশালী `signal` মডিউল রয়েছে। এটি ফিল্টারিং, ফুরিয়ার ট্রান্সফর্ম এবং স্পেকট্রোগ্রামের সাথে কাজ করার মতো নিম্ন-স্তরের DSP কাজগুলির জন্য চমৎকার। এটি `.wav` ফাইল পড়া এবং লেখার একটি সহজ উপায়ও সরবরাহ করে।
- pydub: উচ্চ-স্তরের, সহজ ম্যানিপুলেশনের জন্য `pydub` অসাধারণ। এটি আপনাকে একটি খুব স্বজ্ঞাত API দিয়ে অডিও কাটা, জোড়া লাগানো, ওভারলে করা এবং সহজ প্রভাব প্রয়োগ করার অনুমতি দেয়। এটি প্রিপ্রসেসিং কাজের জন্য দুর্দান্ত।
- NumPy & Matplotlib: যদিও এগুলি অডিও-নির্দিষ্ট নয়, তবে অপরিহার্য। NumPy অডিও ডেটা রাখার জন্য মৌলিক ডেটা কাঠামো (N-ডাইমেনশনাল অ্যারে) সরবরাহ করে এবং Matplotlib প্লটিং এবং ভিজ্যুয়ালাইজেশনের জন্য স্ট্যান্ডার্ড।
ব্যবহারিক বিশ্লেষণ: ওয়েভফর্ম থেকে অন্তর্দৃষ্টি
চলুন, এবার হাতে-কলমে কাজ করা যাক। প্রথমে, নিশ্চিত করুন যে আপনার প্রয়োজনীয় লাইব্রেরি ইনস্টল করা আছে:
pip install librosa matplotlib numpy scipy
আপনার কাজ করার জন্য একটি অডিও ফাইলেরও প্রয়োজন হবে। এই উদাহরণগুলির জন্য, আমরা ধরে নেব আপনার কাছে `audio_sample.wav` নামে একটি ফাইল আছে।
অডিও লোড এবং ভিজ্যুয়ালাইজ করা
আমাদের প্রথম পদক্ষেপ সবসময় অডিও ডেটাকে একটি NumPy অ্যারেতে লোড করা। Librosa এটি অবিশ্বাস্যভাবে সহজ করে তোলে।
import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np
# Define the path to your audio file
file_path = 'audio_sample.wav'
# Load the audio file
# y is the audio time series (a numpy array)
# sr is the sampling rate
y, sr = librosa.load(file_path)
# Plot the waveform
plt.figure(figsize=(14, 5))
librosa.display.waveshow(y, sr=sr)
plt.title('Audio Waveform')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.grid(True)
plt.show()
এই কোডটি আপনার অডিও ফাইল লোড করে এবং এর ওয়েভফর্ম প্রদর্শন করে। আপনি সময়ের সাথে সাথে রেকর্ডিংয়ের জোরালো এবং শান্ত অংশগুলি অবিলম্বে দেখতে পাবেন।
ফ্রিকোয়েন্সি কন্টেন্ট উন্মোচন: স্পেকট্রোগ্রাম
একটি ওয়েভফর্ম কার্যকর, কিন্তু একটি স্পেকট্রোগ্রাম আমাদের আরও সমৃদ্ধ একটি দৃশ্য দেয়। একটি স্পেকট্রোগ্রাম সময়ের সাথে সাথে একটি সিগন্যালের স্পেকট্রামকে ভিজ্যুয়ালাইজ করে। অনুভূমিক অক্ষ সময়কে, উল্লম্ব অক্ষ ফ্রিকোয়েন্সিকে এবং রঙ একটি নির্দিষ্ট সময়ে একটি নির্দিষ্ট ফ্রিকোয়েন্সির প্রশস্ততাকে উপস্থাপন করে।
# Compute the Short-Time Fourier Transform (STFT)
D = librosa.stft(y)
# Convert amplitude to decibels (a more intuitive scale)
DB = librosa.amplitude_to_db(np.abs(D), ref=np.max)
# Plot the spectrogram
plt.figure(figsize=(14, 5))
librosa.display.specshow(DB, sr=sr, x_axis='time', y_axis='log')
plt.colorbar(format='%+2.0f dB')
plt.title('Log-Frequency Power Spectrogram')
plt.show()
একটি স্পেকট্রোগ্রামের সাহায্যে, আপনি আক্ষরিক অর্থেই দেখতে পারেন সঙ্গীতের একটি অংশে নোটগুলি, একজন ব্যক্তির বক্তৃতায় ফরম্যান্টগুলি, বা একটি মেশিনের গুঞ্জনের বৈশিষ্ট্যপূর্ণ ফ্রিকোয়েন্সি সিগনেচার।
অর্থপূর্ণ ফিচার এক্সট্র্যাক্ট করা
প্রায়শই, আমরা জটিল অডিও সিগন্যালটিকে কয়েকটি সংখ্যা বা ভেক্টরে সংকুচিত করতে চাই যা এর মূল বৈশিষ্ট্যগুলি বর্ণনা করে। এগুলিকে ফিচার বলা হয় এবং এগুলি অডিওর জন্য মেশিন লার্নিং মডেলগুলির প্রাণ।
জিরো-ক্রসিং রেট (ZCR): এটি হলো সেই হার যেখানে সিগন্যাল তার চিহ্ন পরিবর্তন করে (ধনাত্মক থেকে ঋণাত্মক বা বিপরীত)। একটি উচ্চ ZCR প্রায়শই কোলাহলপূর্ণ বা পারcussive শব্দ (যেমন সিম্বাল বা স্ট্যাটিক) নির্দেশ করে, যেখানে একটি নিম্ন ZCR টোনাল, সুরেলা শব্দের (যেমন একটি বাঁশি বা একটি গাওয়া স্বরবর্ণ) জন্য সাধারণ।
zcr = librosa.feature.zero_crossing_rate(y)
print(f"Average Zero-Crossing Rate: {np.mean(zcr)}")
স্পেকট্রাল সেন্ট্রয়েড: এই ফিচারটি স্পেকট্রামের "ভরকেন্দ্র" উপস্থাপন করে। এটি একটি শব্দের উজ্জ্বলতার পরিমাপ। একটি উচ্চ স্পেকট্রাল সেন্ট্রয়েড উচ্চ-ফ্রিকোয়েন্সি কন্টেন্ট সহ একটি শব্দ (যেমন একটি ট্রাম্পেট) নির্দেশ করে, যখন একটি নিম্ন স্পেকট্রাল সেন্ট্রয়েড একটি গাঢ় শব্দ (যেমন একটি সেলো) নির্দেশ করে।
spectral_centroids = librosa.feature.spectral_centroid(y=y, sr=sr)[0]
# Plotting the spectral centroid over time
frames = range(len(spectral_centroids))
t = librosa.frames_to_time(frames, sr=sr)
plt.figure(figsize=(14, 5))
librosa.display.waveshow(y, sr=sr, alpha=0.4)
plt.plot(t, spectral_centroids, color='r') # Display spectral centroid in red
plt.title('Spectral Centroid')
plt.show()
মেল-ফ্রিকোয়েন্সি সেপস্ট্রাল কোএফিসিয়েন্টস (MFCCs): এটি সম্ভবত অডিও ক্লাসিফিকেশন কাজের জন্য সবচেয়ে গুরুত্বপূর্ণ ফিচার, বিশেষত স্পিচ রিকগনিশন এবং মিউজিক জেনার ক্লাসিফিকেশনে। MFCCs হলো একটি শব্দের স্বল্পমেয়াদী পাওয়ার স্পেকট্রামের একটি সংক্ষিপ্ত উপস্থাপনা, যা একটি ননলাইনার মেল স্কেল ফ্রিকোয়েন্সিতে লগ পাওয়ার স্পেকট্রামের একটি লিনিয়ার কোসাইন ট্রান্সফর্মের উপর ভিত্তি করে তৈরি। এটি শুনতে জটিল মনে হলেও, মূল ধারণাটি হলো এগুলি মানুষের শ্রবণ উপলব্ধি মডেল করার জন্য ডিজাইন করা হয়েছে, যা এগুলিকে সেইসব কাজের জন্য অত্যন্ত কার্যকর করে তোলে যেখানে মানুষের মতো বোঝার প্রয়োজন হয়।
mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)
# Visualize the MFCCs
plt.figure(figsize=(14, 5))
librosa.display.specshow(mfccs, sr=sr, x_axis='time')
plt.colorbar()
plt.title('MFCCs')
plt.show()
পিচ এবং টেম্পো সনাক্তকরণ
Librosa সঙ্গীত-নির্দিষ্ট বিশ্লেষণের জন্য উচ্চ-স্তরের ফাংশনও সরবরাহ করে।
টেম্পো এবং বিট ট্র্যাকিং: আমরা সহজেই গ্লোবাল টেম্পো (প্রতি মিনিটে বিট) অনুমান করতে পারি এবং অডিওতে বিটগুলির অবস্থান খুঁজে বের করতে পারি।
# Estimate tempo and find beat frames
tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr)
print(f'Estimated tempo: {tempo:.2f} beats per minute')
# Convert beat frames to time
beat_times = librosa.frames_to_time(beat_frames, sr=sr)
এটি কেবল হিমশৈলের চূড়া মাত্র। Librosa ছন্দ, הרমনি এবং টোনালিটি বিশ্লেষণের জন্য কয়েক ডজন ফিচার সরবরাহ করে, যা এটিকে মিউজিক ইনফরমেশন রিট্রিভাল (MIR)-এর জন্য একটি অবিশ্বাস্যভাবে শক্তিশালী টুল করে তোলে।
পর্ব ২: সৃষ্টির কারুশিল্প: পাইথন দিয়ে শব্দ সংশ্লেষণ
যদি বিশ্লেষণ জিনিসগুলিকে আলাদা করার বিষয়ে হয়, তবে সংশ্লেষণ হলো সেগুলিকে নিচ থেকে তৈরি করা। পাইথনের সাহায্যে, আপনি একজন ডিজিটাল বাদ্যযন্ত্র নির্মাতা হতে পারেন, এমন শব্দ তৈরি করতে পারেন যা আগে কখনও ছিল না, সবই কয়েক লাইন কোডের মাধ্যমে। মূল ধারণাটি হলো NumPy অ্যারেতে এমন মান তৈরি করা যা প্লেব্যাক করার সময় আপনার ডিজাইন করা শব্দ তরঙ্গ তৈরি করে।
মৌলিক সংশ্লেষণ কৌশল
শব্দ সংশ্লেষণের অনেক উপায় আছে, প্রত্যেকটির নিজস্ব চরিত্র রয়েছে। এখানে কয়েকটি মৌলিক পদ্ধতি উল্লেখ করা হলো।
- অ্যাডিটিভ সিন্থেসিস (Additive Synthesis): সবচেয়ে সহজ এবং স্বজ্ঞাত পদ্ধতি। ফুরিয়ারের উপপাদ্যের উপর ভিত্তি করে, এটি বলে যে কোনও জটিল পর্যায়ক্রমিক ওয়েভফর্মকে সরল সাইন ওয়েভের (হারমোনিক্স) যোগফল হিসাবে উপস্থাপন করা যেতে পারে। বিভিন্ন ফ্রিকোয়েন্সি, প্রশস্ততা এবং ফেজের সাইন ওয়েভ যোগ করে, আপনি অবিশ্বাস্যভাবে সমৃদ্ধ এবং জটিল টিম্বার তৈরি করতে পারেন।
- সাবট্র্যাকটিভ সিন্থেসিস (Subtractive Synthesis): এটি অ্যাডিটিভের বিপরীত। আপনি একটি হারমোনিক্যালি সমৃদ্ধ ওয়েভফর্ম (যেমন একটি স্কয়ার ওয়েভ বা সটুথ ওয়েভ) দিয়ে শুরু করেন এবং তারপর ফিল্টার ব্যবহার করে ফ্রিকোয়েন্সিগুলি খোদাই করে বা বিয়োগ করে ফেলেন। এটি বেশিরভাগ ক্লাসিক অ্যানালগ সিন্থেসাইজারের ভিত্তি।
- ফ্রিকোয়েন্সি মডুলেশন (FM) সিন্থেসিস (Frequency Modulation (FM) Synthesis): একটি অত্যন্ত কার্যকর এবং শক্তিশালী কৌশল যেখানে একটি অসিলেটরের ("ক্যারিয়ার") ফ্রিকোয়েন্সি অন্য একটি অসিলেটরের ("মডুলেটর") আউটপুট দ্বারা মডুলেট করা হয়। এটি খুব জটিল, গতিশীল এবং প্রায়শই ধাতব বা ঘণ্টার মতো শব্দ তৈরি করতে পারে।
অডিও সংশ্লেষণের জন্য প্রয়োজনীয় পাইথন লাইব্রেরি
সংশ্লেষণের জন্য, আমাদের টুলকিট সহজ কিন্তু কম শক্তিশালী নয়।
- NumPy: এটি একেবারে মূল ভিত্তি। আমরা আমাদের শব্দ তরঙ্গ উপস্থাপনকারী সংখ্যার অ্যারে তৈরি এবং ম্যানিপুলেট করতে NumPy ব্যবহার করব। এর গাণিতিক ফাংশনগুলি সাইন, স্কয়ার এবং ট্রায়াঙ্গেল ওয়েভের মতো ওয়েভফর্ম তৈরির জন্য অপরিহার্য।
- SciPy: আমরা আমাদের NumPy অ্যারেগুলিকে স্ট্যান্ডার্ড `.wav` অডিও ফাইলগুলিতে সংরক্ষণ করতে SciPy-এর `scipy.io.wavfile.write` ফাংশনটি ব্যবহার করব যা যেকোনো মিডিয়া প্লেয়ারে চালানো যায়।
ব্যবহারিক সংশ্লেষণ: কোড থেকে শব্দ তৈরি
চলুন, শব্দ তৈরি করা শুরু করি। নিশ্চিত করুন যে আপনার কাছে SciPy এবং NumPy প্রস্তুত আছে।
একটি বিশুদ্ধ টোন (সাইন ওয়েভ) তৈরি করা
আমরা যে সবচেয়ে সহজ শব্দটি তৈরি করতে পারি তা হলো একটি বিশুদ্ধ টোন, যা কেবল একটি নির্দিষ্ট ফ্রিকোয়েন্সির একটি সাইন ওয়েভ।
import numpy as np
from scipy.io.wavfile import write
# --- Synthesis Parameters ---
sr = 44100 # Sample rate
duration = 3.0 # seconds
frequency = 440.0 # Hz (A4 note)
# Generate a time array
# This creates a sequence of numbers from 0 to 'duration', with 'sr' points per second
t = np.linspace(0., duration, int(sr * duration), endpoint=False)
# Generate the sine wave
# The formula for a sine wave is: amplitude * sin(2 * pi * frequency * time)
amplitude = np.iinfo(np.int16).max * 0.5 # Use half of the max 16-bit integer value
data = amplitude * np.sin(2. * np.pi * frequency * t)
# Convert to 16-bit data and write to a .wav file
write('sine_wave_440hz.wav', sr, data.astype(np.int16))
print("Generated 'sine_wave_440hz.wav' successfully.")
আপনি যদি এই কোডটি চালান, তবে এটি একই ডিরেক্টরিতে একটি `.wav` ফাইল তৈরি করবে। এটি খুলুন, এবং আপনি একটি নিখুঁত A4 নোট শুনতে পাবেন!
এনভেলপ (ADSR) দিয়ে শব্দকে আকার দেওয়া
আমাদের বিশুদ্ধ টোনটি কিছুটা বিরক্তিকর; এটি হঠাৎ শুরু হয় এবং হঠাৎ বন্ধ হয়ে যায়। বাস্তব জগতের শব্দগুলির একটি গতিশীল আকার থাকে। আমরা এটি একটি এনভেলপ (envelope) ব্যবহার করে নিয়ন্ত্রণ করতে পারি। সবচেয়ে সাধারণ প্রকারটি হলো ADSR এনভেলপ:
- অ্যাটাক (Attack): শব্দটি শূন্য থেকে তার সর্বোচ্চ স্তরে পৌঁছাতে যে সময় নেয়।
- ডিকে (Decay): সর্বোচ্চ স্তর থেকে সাসটেইন স্তরে নামতে যে সময় নেয়।
- সাসটেইন (Sustain): নোটটি সক্রিয় থাকাকালীন শব্দটি যে স্তরে ধরে রাখা হয়।
- রিলিজ (Release): নোটটি ছেড়ে দেওয়ার পরে শব্দটি শূন্যে মিলিয়ে যেতে যে সময় নেয়।
চলুন, আমাদের সাইন ওয়েভে একটি সহজ লিনিয়ার অ্যাটাক এবং রিলিজ প্রয়োগ করি।
# --- Envelope Parameters ---
attack_time = 0.1 # seconds
release_time = 0.5 # seconds
# Create the envelope
attack_samples = int(sr * attack_time)
release_samples = int(sr * release_time)
sustain_samples = len(t) - attack_samples - release_samples
attack = np.linspace(0, 1, attack_samples)
# For simplicity, we'll skip decay and make sustain level 1
sustain = np.ones(sustain_samples)
release = np.linspace(1, 0, release_samples)
envelope = np.concatenate([attack, sustain, release])
# Apply the envelope to our sine wave data
enveloped_data = data * envelope
# Write the new sound to a file
write('enveloped_sine_wave.wav', sr, enveloped_data.astype(np.int16))
print("Generated 'enveloped_sine_wave.wav' successfully.")
এই নতুন শব্দটি মসৃণভাবে শুরু হবে এবং আলতোভাবে শেষ হবে, যা এটিকে অনেক বেশি সঙ্গীতময় এবং স্বাভাবিক শোনায়।
অ্যাডিটিভ সিন্থেসিস দিয়ে জটিলতা তৈরি
এখন, হারমোনিক্স যোগ করে একটি সমৃদ্ধ টিম্বার তৈরি করা যাক। উদাহরণস্বরূপ, একটি স্কয়ার ওয়েভ একটি মৌলিক ফ্রিকোয়েন্সি এবং তার সমস্ত বিজোড় হারমোনিক্স নিয়ে গঠিত, যার প্রশস্ততা আনুপাতিকভাবে হ্রাস পায়। চলুন, একটি তৈরি করার চেষ্টা করি।
# --- Additive Synthesis ---
fundamental_freq = 220.0 # A3 note
# Start with the fundamental tone
final_wave = np.sin(2. * np.pi * fundamental_freq * t)
# Add odd harmonics
num_harmonics = 10
for i in range(3, num_harmonics * 2, 2):
harmonic_freq = fundamental_freq * i
harmonic_amplitude = 1.0 / i
final_wave += harmonic_amplitude * np.sin(2. * np.pi * harmonic_freq * t)
# Normalize the wave to prevent clipping (amplitude > 1)
final_wave = final_wave / np.max(np.abs(final_wave))
# Apply our envelope from before
rich_sound_data = (amplitude * final_wave) * envelope
# Write to file
write('additive_synthesis_sound.wav', sr, rich_sound_data.astype(np.int16))
print("Generated 'additive_synthesis_sound.wav' successfully.")
এই নতুন ফাইলটি শুনুন। এটি সাধারণ সাইন ওয়েভের চেয়ে অনেক বেশি সমৃদ্ধ এবং জটিল শোনাবে, যা একটি স্কয়ার ওয়েভের গুঞ্জনযুক্ত শব্দের দিকে যাবে। আপনি এইমাত্র অ্যাডিটিভ সিন্থেসিস সম্পাদন করেছেন!
পর্ব ৩: মিথোজীবী সম্পর্ক: যেখানে বিশ্লেষণ এবং সংশ্লেষণ একত্রিত হয়
যদিও আমরা বিশ্লেষণ এবং সংশ্লেষণকে পৃথক বিষয় হিসাবে বিবেচনা করেছি, তাদের আসল শক্তি তখনই উন্মোচিত হয় যখন সেগুলি একসাথে ব্যবহৃত হয়। তারা একটি ফিডব্যাক লুপ গঠন করে যেখানে বোঝা সৃষ্টিকে অবহিত করে, এবং সৃষ্টি বোঝার জন্য নতুন উপাদান সরবরাহ করে।
দুই জগতের মধ্যে সেতু: রিসিন্থেসিস (Resynthesis)
যেখানে এই দুটি মিলিত হয় তার মধ্যে সবচেয়ে উত্তেজনাপূর্ণ ক্ষেত্রগুলির মধ্যে একটি হলো রিসিন্থেসিস। প্রক্রিয়াটি এভাবে কাজ করে:
- বিশ্লেষণ (Analyze): একটি বাস্তব-জগতের শব্দ (যেমন, একটি বেহালার রেকর্ডিং) নিন এবং এর মূল অ্যাকোস্টিক বৈশিষ্ট্যগুলি—এর হারমোনিক কন্টেন্ট, এর পিচ পরিবর্তন, এর প্রশস্ততার এনভেলপ—বের করুন।
- মডেল (Model): এই বৈশিষ্ট্যগুলির উপর ভিত্তি করে একটি গাণিতিক মডেল তৈরি করুন।
- সংশ্লেষণ (Synthesize): আপনার সংশ্লেষণ ইঞ্জিন ব্যবহার করে এই মডেলের উপর ভিত্তি করে একটি নতুন শব্দ তৈরি করুন।
এটি আপনাকে অত্যন্ত বাস্তবসম্মত সিন্থেটিক বাদ্যযন্ত্র তৈরি করতে বা একটি শব্দের বৈশিষ্ট্য নিয়ে অন্যটিতে প্রয়োগ করতে দেয় (যেমন, একটি গিটারের উপর মানুষের কণ্ঠের স্পেকট্রাল এনভেলপ আরোপ করে এটিকে "কথা বলানোর" মতো শোনানো)।
অডিও এফেক্ট তৈরি করা
কার্যত সমস্ত ডিজিটাল অডিও এফেক্ট—রিভার্ব, ডিলে, ডিস্টরশন, কোরাস—বিশ্লেষণ এবং সংশ্লেষণের একটি মিশ্রণ।
- ডিলে/ইকো (Delay/Echo): এটি একটি সহজ প্রক্রিয়া। সিস্টেমটি আগত অডিও বিশ্লেষণ করে, এটিকে একটি বাফারে (মেমরির একটি অংশ) সংরক্ষণ করে, এবং তারপর এটিকে আউটপুট স্ট্রিমে পরবর্তী সময়ে, প্রায়শই একটি হ্রাসকৃত প্রশস্ততায়, সংশ্লেষণ করে ফিরিয়ে দেয়।
- ডিস্টরশন (Distortion): এই এফেক্টটি ইনপুট সিগন্যালের প্রশস্ততা বিশ্লেষণ করে। যদি এটি একটি নির্দিষ্ট থ্রেশহোল্ড অতিক্রম করে, তবে এটি একটি গাণিতিক ফাংশন ("ওয়েভশেপার") প্রয়োগ করে একটি নতুন আউটপুট সংশ্লেষণ করে যা ওয়েভফর্মটিকে ক্লিপ বা পরিবর্তন করে, নতুন সমৃদ্ধ হারমোনিক্স যোগ করে।
- রিভার্ব (Reverb): এটি একটি ভৌত স্থানের শব্দ অনুকরণ করে। এটি হাজার হাজার ক্ষুদ্র, ক্ষয়িষ্ণু প্রতিধ্বনি (প্রতিফলন) সংশ্লেষণের একটি জটিল প্রক্রিয়া যা একটি বাস্তব ঘরের অ্যাকোস্টিক বৈশিষ্ট্যগুলির বিশ্লেষণের উপর ভিত্তি করে মডেল করা হয়।
এই সমন্বয়ের বাস্তব-বিশ্বের প্রয়োগ
বিশ্লেষণ এবং সংশ্লেষণের মধ্যে এই মিথস্ক্রিয়া শিল্প জুড়ে উদ্ভাবনকে চালিত করে:
- স্পিচ টেকনোলজি (Speech Technology): টেক্সট-টু-স্পিচ (TTS) সিস্টেমগুলি মানুষের মতো বক্তৃতা সংশ্লেষণ করে, যা প্রায়শই বিপুল পরিমাণে রেকর্ড করা মানুষের বক্তৃতার গভীর বিশ্লেষণের উপর ভিত্তি করে প্রশিক্ষিত হয়। বিপরীতভাবে, অটোমেটিক স্পিচ রিকগনিশন (ASR) সিস্টেমগুলি একজন ব্যবহারকারীর ভয়েস বিশ্লেষণ করে এটিকে পাঠ্যে প্রতিলিপি করে।
- মিউজিক ইনফরমেশন রিট্রিভাল (MIR): Spotify-এর মতো সিস্টেমগুলি তাদের সঙ্গীত ক্যাটালগের গভীর বিশ্লেষণ ব্যবহার করে গানের বৈশিষ্ট্যগুলি (টেম্পো, জেনার, মুড) বুঝতে পারে। এই বিশ্লেষণটি তখন নতুন প্লেলিস্ট সংশ্লেষণ করতে বা সঙ্গীত সুপারিশ করতে ব্যবহার করা যেতে পারে।
- জেনারেটিভ আর্ট এবং মিউজিক (Generative Art and Music): আধুনিক AI মডেলগুলি সঙ্গীত বা শব্দের বিশাল ডেটাসেট বিশ্লেষণ করতে পারে এবং তারপরে একই শৈলীতে সম্পূর্ণ নতুন, মৌলিক সঙ্গীত তৈরি করতে পারে। এটি বিশ্লেষণ-তারপর-সংশ্লেষণ দৃষ্টান্তের একটি সরাসরি প্রয়োগ।
- গেম অডিও (Game Audio): উন্নত গেম অডিও ইঞ্জিনগুলি রিয়েল-টাইমে শব্দ সংশ্লেষণ করে। তারা গেমের ফিজিক্স ইঞ্জিন (যেমন, একটি গাড়ির গতি) বিশ্লেষণ করতে পারে এবং সেই প্যারামিটারগুলি ব্যবহার করে একটি সংশ্লিষ্ট ইঞ্জিনের শব্দ সংশ্লেষণ করতে পারে, যা একটি নিখুঁতভাবে প্রতিক্রিয়াশীল এবং গতিশীল অডিও অভিজ্ঞতা তৈরি করে।
উপসংহার: ডিজিটাল অডিওতে আপনার যাত্রা
আমরা বিচ্ছেদ থেকে নির্মাণে, শব্দ বোঝা থেকে এটি তৈরি করার পথে যাত্রা করেছি। আমরা দেখেছি যে শব্দ বিশ্লেষণ গভীরভাবে শোনার, অডিওর ক্ষণস্থায়ী গুণাবলীকে পরিমাপ করার এবং সেগুলিকে ডেটাতে পরিণত করার সরঞ্জাম সরবরাহ করে। আমরা আরও দেখেছি যে শব্দ সংশ্লেষণ আমাদের গাণিতিক যুক্তি ছাড়া আর কিছুই নয় এমন ভিত্তি থেকে শব্দের নতুন জগত তৈরি করার জন্য একটি সোনিক রঙের প্যালেট দেয়।
মূল কথা হলো এগুলি বিরোধী শক্তি নয় বরং একই মুদ্রার দুই পিঠ। সেরা অডিও অ্যাপ্লিকেশন, সবচেয়ে অন্তর্দৃষ্টিপূর্ণ গবেষণা, এবং সবচেয়ে সৃজনশীল শৈল্পিক প্রচেষ্টা প্রায়শই এই দুটি ক্ষেত্রের সংযোগস্থলে থাকে। আমরা বিশ্লেষণের মাধ্যমে যে ফিচারগুলি বের করি তা আমাদের সিন্থেসাইজারের প্যারামিটার হয়ে ওঠে। আমরা সিন্থেসাইজার দিয়ে যে শব্দ তৈরি করি তা আমাদের বিশ্লেষণ মডেলের জন্য ডেটা হয়ে ওঠে।
পাইথন এবং এর অবিশ্বাস্য লাইব্রেরি ইকোসিস্টেম যেমন Librosa, SciPy, এবং NumPy-এর সাহায্যে, এই আকর্ষণীয় জগতটি অন্বেষণ করার জন্য প্রবেশের বাধা আগের চেয়ে অনেক কম। এই নিবন্ধের উদাহরণগুলি কেবল একটি সূচনা বিন্দু। আসল উত্তেজনা শুরু হয় যখন আপনি এই কৌশলগুলি একত্রিত করতে শুরু করেন, একটির আউটপুটকে অন্যটির ইনপুটে ফিড করেন এবং শব্দের প্রকৃতি সম্পর্কে আপনার নিজের প্রশ্ন জিজ্ঞাসা করেন।
সুতরাং, আপনার আগ্রহের একটি শব্দ লোড করুন। এর স্পেকট্রাম বিশ্লেষণ করুন। এটিকে অনুকরণ করে একটি শব্দ সংশ্লেষণ করার চেষ্টা করুন। হাজারো শব্দের যাত্রা কোডের একটি লাইন দিয়ে শুরু হয়।